import java.io.FileNotFoundException;
import java.util.Scanner;

class Person implements Cloneable{
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();//这个是一个受查异常（编译异常），如果我们不去处理的话我们就需要throws CloneNotSupportedException
    }
}
public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            int a = scanner.nextInt();
            int ret = 10/a;
            System.out.println("ret的值是" + ret);
        } catch (ArithmeticException e){
            System.out.println("我捕获到了： ArithmeticException 这个异常！");
        } catch(NullPointerException e) {
            System.out.println("空指针异常！");
        } finally {
            scanner.close();//我们使用完scanner资源之后就释放，finally此时就起到了这个左右，永远会被执行
            System.out.println("finally被执行了" );
            //此处的语句无论是否发生异常都会被执行
        }
        System.out.println("after");
    }
    public static void main2(String[] args) {
        System.out.println("before");
        try {
            System.out.println(10/0);
            int arr[] = null;
            System.out.println(arr.length);
            System.out.println("abcde");
        } catch (ArithmeticException e){
            System.out.println("我捕获到了： ArithmeticException 这个异常！");
            e.printStackTrace();
        } catch(NullPointerException e) {
            System.out.println("空指针异常！");
            e.printStackTrace();
        } finally {
            System.out.println("finally被执行了" );
            //此处的语句无论是否发生异常都会被执行
        }

        System.out.println("after");
    }



    //在main函数后面的声明还是交给了jvm，并没有处理
    public static void main1(String[] args) /*throws CloneNotSupportedException, FileNotFoundException*/ {
        //多个异常通过逗号隔开，如果多个异常属于父子类关系只需要抛出父类即可
        Person person = new Person();
        try {
            Person person2 = (Person)person.clone();//此时这里会报错，是因为出现了受查异常，clone()的返回类型是Object类型的，需要进行强制类型转换
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
        //如果我们不想处理那么就需要 通过 throws 声明异常，交给方法的调用者去处理,就不会报错了
    }

}
